Spring之十 整合Sqlite - - CSDN博客

创建时间:2017/7/28 11:41
来源:http://blog.csdn.net/icanhaha/article/details/51016477


1.加入jar包

sqlite-jdbc-3.8.11.2.jar

2.applicationContext.xml配置文件中配置

  1. <!-- sqlite内存数据库连接池-->    
  2.     <bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">    
  3.         <property name="poolProperties">    
  4.             <bean class="org.apache.tomcat.jdbc.pool.PoolProperties">    
  5.                 <property name="driverClassName" value="org.sqlite.JDBC"/>    
  6.                 <property name="url" value="jdbc:sqlite:hello.db"/>    
  7.                 <property name="minIdle" value="10"/>    
  8.                 <property name="maxActive" value="100"/>    
  9.                 <!-- 数据库连接池配置 -->    
  10.                 <!-- 初始化连接数量 -->    
  11.                 <property name="initialSize" value="50"/>    
  12.                 <!-- 最大连接数量 -->    
  13.                 <!-- 最小空闲连接数量 -->    
  14.                 <property name="removeAbandoned" value="true" />    
  15.                 <property name="removeAbandonedTimeout" value="600" />    
  16.                 <!-- 验证连接是否有效 -->    
  17.                 <property name="validationQuery" value="select 1" />    
  18.                 <!-- 验证失败时,是否将连接从池中丢弃 -->    
  19.                 <property name="testWhileIdle" value="true" />    
  20.                 <!-- 把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止(毫秒,30分钟) -->    
  21.                 <property name="timeBetweenEvictionRunsMillis" value="1200000" />    
  22.                 <!-- 连接池中连接可空闲的时间(毫秒,5分钟) -->    
  23.                 <property name="minEvictableIdleTimeMillis" value="1800000" />    
  24.                 <!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->    
  25.                 <property name="numTestsPerEvictionRun" value="5" />    
  26.             </bean>    
  27.         </property>    
  28.     </bean>    

3.封装SqliteUtil对象

  1. @Repository    
  2. public class SqliteUtil {    
  3.     
  4.     private Logger logger = Logger.getLogger(this.getClass());    
  5.     /**    
  6.      * 数据源    
  7.      */    
  8.     @Resource(name = "sqliteDataSource")    
  9.     private DataSource sqliteDataSource;    
  10.     
  11.     /**    
  12.      * 获取数据库连接    
  13.      * @return conn    
  14.      */    
  15.     public Connection getConnection() throws SQLException {    
  16.         Connection conn = sqliteDataSource.getConnection();    
  17.         conn.setAutoCommit(false);    
  18.         return conn;    
  19.     }    
  20.     
  21.     /**    
  22.      * 关闭数据库连接    
  23.      * @param conn    
  24.      */    
  25.     public void close(Connection conn, Statement stmt, ResultSet rs) {    
  26.         if (null != rs) {    
  27.             try {    
  28.                 rs.close();    
  29.             } catch (SQLException ex) {    
  30.                 logger.error(null, ex);    
  31.             }    
  32.             rs = null;    
  33.         }    
  34.         if (null != stmt) {    
  35.             try {    
  36.                 stmt.close();    
  37.             } catch (SQLException ex) {    
  38.                 logger.error(null, ex);    
  39.             }    
  40.             stmt = null;    
  41.         }    
  42.         if (null != rs) {    
  43.             try {    
  44.                 rs.close();    
  45.             } catch (SQLException ex) {    
  46.                 logger.error(null, ex);    
  47.             }    
  48.             rs = null;    
  49.         }    
  50.     }    
  51. }    


4.封装Dao层

  1. @Repository(value = "realtimeDao")    
  2. public class RealtimeDaoImpl implements IRealtimeDao {    
  3.     
  4.     @Resource    
  5.     private SqliteUtil sqliteUtil;    
  6.     
  7.     @Override    
  8.     public void initRealtime() throws Exception {    
  9.         Map<String, List<String>> tables = getFieldNamesByClass(Realtime.class);    
  10.         Connection conn = sqliteUtil.getConnection();    
  11.         Statement stmt = conn.createStatement();    
  12.         StringBuilder sb = new StringBuilder();    
  13.         for (String table : tables.keySet()) {    
  14.             sb.append("CREATE TABLE IF NOT EXISTS ");    
  15.             sb.append("'").append(table).append("'");    
  16.             sb.append("(");    
  17.             for (String column : tables.get(table)) {    
  18.                 sb.append(column).append(" string");    
  19.                 if (column.contains("termSn")) {    
  20.                     sb.append(" PRIMARY KEY UNIQUE");    
  21.                 }    
  22.                 sb.append(",");    
  23.             }    
  24.             sb.delete(sb.lastIndexOf(","), sb.lastIndexOf(",") + 1);    
  25.             sb.append(");");    
  26.             stmt.addBatch(sb.toString());    
  27.             sb.delete(0, sb.length());    
  28.         }    
  29.         stmt.executeBatch();    
  30.         conn.commit();    
  31.         sqliteUtil.close(conn, stmt, null);    
  32.     }    
  33.     
  34.     @Override    
  35.     public void saveObject(Object obj) throws Exception {    
  36.         Map<String, List<String>> tablesMap = getFieldNamesByClass(Realtime.class);    
  37.         Map<String, String> paramMap = getFieldValuesByClass(obj);    
  38.         StringBuilder sql = new StringBuilder();    
  39.         StringBuilder value = new StringBuilder();    
  40.         Connection conn = sqliteUtil.getConnection();    
  41.         Statement stmt = conn.createStatement();    
  42.         int indexFlag;    
  43.         //组装每个table的字段    
  44.         for (String table : tablesMap.keySet()) {    
  45.             String sqlStr = this.buildSaveSql(table, tablesMap, paramMap, sql, value);    
  46.             stmt.addBatch(sqlStr);    
  47.             sql.delete(0, sql.length());    
  48.             value.delete(0, value.length());    
  49.         }    
  50.         stmt.executeBatch();    
  51.         conn.commit();    
  52.         sqliteUtil.close(conn, stmt, null);    
  53.     }    
  54.     
  55.     @Override    
  56.     public void saveObjectList(List<?> objList) throws Exception {    
  57.         int listSize = objList.size() - 1;    
  58.         int batchFlag = 0;    
  59.         Map<String, List<String>> tablesMap = getFieldNamesByClass(objList.get(0).getClass());    
  60.         Map<String, String> paramMap;    
  61.         List<String> sqlList = new ArrayList<String>();    
  62.         StringBuilder sql = new StringBuilder();    
  63.         StringBuilder value = new StringBuilder();    
  64.     
  65.         Connection conn = sqliteUtil.getConnection();    
  66.         Statement stmt = conn.createStatement();    
  67.         for (int i = 0; i <= listSize; i++) {    
  68.             Object obj = objList.remove(0);    
  69.             paramMap = getFieldValuesByClass(obj);    
  70.             //组装每个table的字段    
  71.             for (String table : tablesMap.keySet()) {    
  72.                 String sqlStr = this.buildSaveSql(table, tablesMap, paramMap, sql, value);    
  73.                 stmt.addBatch(sqlStr);    
  74.                 sql.delete(0, sql.length());    
  75.                 value.delete(0, value.length());    
  76.                 if (batchFlag == 5000 || i == listSize) {    
  77.                     stmt.executeBatch();    
  78.                     batchFlag++;    
  79.                 }    
  80.             }    
  81.         }    
  82.         conn.commit();    
  83.         sqliteUtil.close(conn, stmt, null);    
  84.     }    
  85.     
  86.     @Override    
  87.     public Map<String, String> findOneObject(String termSn, Class clazz) throws Exception {    
  88.         Map<String, List<String>> tablesMap = getFieldNamesByClass(clazz);    
  89.         StringBuilder sql = new StringBuilder();    
  90.         StringBuilder field = new StringBuilder();    
  91.         int tableSize = tablesMap.keySet().size();    
  92.     
  93.         int index = 0;    
  94.         for (String table : tablesMap.keySet()) {    
  95.             if (index != 0) {    
  96.                 sql.append(" LEFT JOIN ").append("'").append(table).append("' t").append(index).append(" ON ").append(" t0.termSn=t").append(index).append(".termSn");    
  97.             } else {    
  98.                 sql.append(" FROM ").append("'").append(table).append("' t").append(index);    
  99.             }    
  100.             field.append(" t").append(index).append(".*").append(",");    
  101.             index++;    
  102.         }    
  103.         sql.append(" WHERE t0.termSn='").append(termSn).append("'");//.append("' LIMIT 0,1");    
  104.         field.delete(field.lastIndexOf(","), field.lastIndexOf(",") + 1);    
  105.         sql.insert(0, field);    
  106.         sql.insert(0, "SELECT ");    
  107.         field = null;    
  108.     
  109.         Connection conn = sqliteUtil.getConnection();    
  110.         Statement stmt = conn.createStatement();    
  111.         ResultSet rs = stmt.executeQuery(sql.toString());    
  112.         Map<String, String> valueMap = new HashMap<String, String>();    
  113.         if (rs.next()) {    
  114.             ResultSetMetaData data = rs.getMetaData();    
  115.             int columnSize = data.getColumnCount() - 1;    
  116.             for (int i = 1; i <= columnSize; i++) {    
  117.                 valueMap.put(data.getColumnName(i), rs.getString(data.getColumnName(i)));    
  118.             }    
  119.         }    
  120.         return valueMap;    
  121.     }    
  122.     
  123.     /**    
  124.      * 组装多个表的sql    
  125.      */    
  126.     private String buildSaveSql(String table, Map<String, List<String>> tablesMap, Map<String, String> paramMap,    
  127.             StringBuilder sql, StringBuilder values) {    
  128.         sql.append("REPLACE INTO ");    
  129.         sql.append("'").append(table).append("'");    
  130.         sql.append("(");    
  131.         values.append(" VALUES(");    
  132.         //组装字段值    
  133.         for (String column : tablesMap.get(table)) {    
  134.             if (paramMap.containsKey(column)) {    
  135.                 sql.append(column).append(",");    
  136.                 values.append("'").append(paramMap.get(column)).append("',");    
  137.             }    
  138.         }    
  139.         int indexFlag = values.lastIndexOf(",");    
  140.         values.delete(indexFlag, indexFlag + 1);    
  141.         values.append(")");    
  142.     
  143.         indexFlag = sql.lastIndexOf(",");    
  144.         sql.delete(indexFlag, indexFlag + 1);    
  145.         sql.append(")").append(values).append(";");    
  146.         return sql.toString();    
  147.     }    
  148.     
  149.     /**    
  150.      * 根据一个类,获取当前类及子类的字段列表    
  151.      * @param clazz    
  152.      * @return    
  153.      * @throws Exception     
  154.      */    
  155.     private Map<String, List<String>> getFieldNamesByClass(Class clazz) throws Exception {    
  156.         Map<String, List<String>> paramMap = new HashMap<String, List<String>>();    
  157.         String className = clazz.getName();    
  158.         paramMap.put(className, new ArrayList<String>());    
  159.     
  160.         Field[] fs = clazz.getDeclaredFields();    
  161.         List<Field> list = new ArrayList<Field>();    
  162.         list.addAll(Arrays.asList(fs));    
  163.         for (Field field : list) {    
  164.             Class classes = field.getType();    
  165.             if (!classes.getName().contains("com.ithings.")) {    
  166.                 paramMap.get(className).add(field.getName());    
  167.             } else {    
  168.                 //自定义类型    
  169.                 Map<String, List<String>> childMap = getFieldNamesByClass(classes);    
  170.                 paramMap.putAll(childMap);    
  171.             }    
  172.         }    
  173.         return paramMap;    
  174.     }    
  175.     
  176.     /**    
  177.      * 获取一个对象及子对象的字段值(属性名/属性值)    
  178.      */    
  179.     private Map<String, String> getFieldValuesByClass(Object obj) throws Exception {    
  180.         Map<String, String> paramMap = new HashMap<String, String>();    
  181.         String className = obj.getClass().getName();    
  182.     
  183.         Field[] fs = obj.getClass().getDeclaredFields();    
  184.         List<Field> list = new ArrayList<Field>();    
  185.         list.addAll(Arrays.asList(fs));    
  186.         for (Field field : list) {    
  187.             field.setAccessible(true);    
  188.             Object fdValue = field.get(obj);    
  189.             if (null == fdValue) {    
  190.                 continue;    
  191.             }    
  192.             Class classes = field.getType();    
  193.             if (!classes.getName().contains("com.ithings.")) {    
  194.                 paramMap.put(field.getName(), fdValue.toString());    
  195.             } else {    
  196.                 //自定义类型    
  197.                 Map<String, String> childMap = getFieldValuesByClass(fdValue);    
  198.                 paramMap.putAll(childMap);    
  199.             }    
  200.         }    
  201.         return paramMap;    
  202.     }    
  203. }    

注:Sqlite教程